import { getSetting, chooseAddress, showModal } from '../../utils/asyncWx.js';
import regeneratorRuntime from '../../lib/runtime/runtime.js';

// 点击获取地址handleChooseAddress   1.请求用户设置getSetting获取用户的当前设置     设置好了获取地址
//                                  2.如果获取地址为空     点击获取用户界面确认了true  没确认false      没确认就调用openSetting设置调起客户端小程序设置界面
//                                  3.请求地址chooseAddress     将请求到的地址给address.detailedAddress     将地址存储起来
// 监视页码onShow     每次都去获取缓存里address和cart同时设置本地address和cart    调用计算工具
// 底部计算工具calculateToolData     一些数据totalPrice = 0, totalNum = 0, allChecked = true, data = this.data.cart    总价总数是否全选以及cart暂时变量data
//                                  1.data里循环遍历cart  计算总数和价格    控制全选显示      （ 每一个都会被判断只要有一个没有选中allChecked就false那我们也不用计算它了）
//                                  2.data设置allChecked  （还有一种情况长度0就是没有商品，也应该设为false）
//                                  3.算好后设置本地allChecked, totalPrice, totalNum
//                                  4.最后同步cart    wx.setStorageSync('cart', data);      //这里data就是暂时放cart的
// 全选handleCheckAll（点击底部工具栏全选时可以触发）   
//                                  1. 得到两个数据cart, allChecked    
//                                  2.循环购物车重新设置购物车要选中的    
//                                  3.调用calculateToolData重新计算底部的数据
// 商品选中     得到选中商品的id 得到购物车cart     如果选中商品的id和购物车里的id一致-----把它们作为下标 然后将未选中的变为选中的         重新设置cart购物车和calculateToolData底部数据重新计算
// 用户添加商品数量或减少商品数量时numChange  
//                                  1. 用户调整获取到得到id、用户调整获取到的num数量、购物车cart     
//                                  2. 商品的id和购物车里的id一致变成下标    将获取到的数量通过下标从购物车cart里找到      
//                                  3. 最后重置cart    重新计算底部数据
// 删除商品deleteGoods    
//                                  1. 获取商品id、购物车、下标（id相同）
//                                  2. 如果用户弹窗里确定删除商品boole值
//                                  3. 删除下标的index商品     重新设置cart购物车  重新计算底部数据
// 结算handlePay
//                                  1.判断地址是否有   判断是否有商品（totalNum>0）     并给予提示
//                                  2.跳转到支付页面



//数据cart走向：  
// 1.在计算底部工具栏如果有cart遍历cart底部数据更新，保存cart到缓存里
// 2.onShow里获取cart 如果没有置为空    重置cart
// 3.数字输入框组件改变事件  找到cart下标将对应下标的cart数量改变  重置cart
// 4.选中商品   如果商品id和购物车里商品id相同就获取下标 修改购物车里该商品选中状态  重置cart
// 5.删除商品   如果商品id和购物车里商品id相同就获取下标 通过下标删除cart里该商品    重置cart
// 6.底部全选   修改cart的选中状态   重置cart
//总结：一般我们遍历获取到某参数，然后在需要修改的地方获取到该参数，然后改属性 然后this.setData({重置改属性}) 修改的是缓存里的

Page({
  data: {
    //存放地址    不是数组的可以自由添加
    address: {},
    /*购物车数据数组*/
    cart: [],
    // 全选
    allChecked: false,
    // 总价格
    totalPrice: 0,
    // 总数量
    totalNum: 0
  },
  onLoad: function (options) {

  },
  // 点击收货地址按钮 有可能出错我们还是使用异步
  async handleChooseAddress() {
    // 获取权限状态
    try {
      const res1 = await getSetting();//获取用户信息，有时候也会出错，就是进入微信时获取用户信息的函数     弹框访问通讯地址
      let state = res1.authSetting['scope.address'];
      if (state === false) {//如果在上面的弹框访问通讯地址确认了，地址没选择就     openSetting调用用户设置
        await wx.openSetting()
      }
      const address = await chooseAddress()//这里获取用户地址
      // console.log(address);
      address.detailedAddress = address.provinceName + address.cityName + address.countyName + address.detailInfo;//这里是用来显示给用户看填好的地址的   相当于对detailedAddress重新赋值
      wx.setStorageSync('address', address);

    } catch (error) {
      console.log(error)
    }
  },
  /**
   * 生命周期函数--监听页面显示
   */
  onShow: function () {
    // 获取本地存储的收货地址
    const address = wx.getStorageSync('address');
    // 获取缓存中购物车数据   购物车要么获得要么未空数组
    const cart = wx.getStorageSync('cart') || []
    // 计算全选, every数组的方法,每个项返回true才返回true,空数组调用返回true
    //下面都是用于更新数据
    this.setData({ cart, address })
    this.calculateToolData()    // 计算工具栏数据
  },
  // 数字输入框组件改变事件
  // numChange(e) {
  //   let goods_id = e.currentTarget.dataset.id;
  //   let goods_count = e.detail.num;
  //   let { cart } = this.data;
  //   let index = cart.findIndex(v => v.goods_id == goods_id)
  //   cart[index].goods_count = goods_count;
  //   this.setData({ cart })
  //   this.calculateToolData(cart)
  // },
  // 根据商品id 删除商品
  async deleteGoods(e) {
    let goods_id = e.currentTarget.dataset.id;
    let { cart } = this.data;
    const index = cart.findIndex(v => v.goods_id == goods_id);
    let bool = await showModal({ title: '提示', content: '你是否要删除该商品？' })
    if (bool) {
      cart.splice(index, 1);
      this.setData({ cart });
      this.calculateToolData(cart);
    }
  },
  // 商品选中
  handleItemChange(e) {
    const goods_id = e.currentTarget.dataset.id;
    let { cart } = this.data;
    let index = cart.findIndex(v => v.goods_id == goods_id)
    cart[index].checked = !cart[index].checked;
    this.setData({ cart })
    this.calculateToolData(cart)
  },
  // 底部工具栏全选
  handleCheckAll() {
    let { cart, allChecked } = this.data;
    cart.forEach(v => v.checked = !allChecked)
    this.setData({ cart })
    this.calculateToolData(cart)
  },
  // 计算底部工具栏的数据
  calculateToolData() {
    let totalPrice = 0, totalNum = 0, allChecked = true, data = this.data.cart;
    data.forEach(item => {
      if (item.checked) {//如果是选中的就操作选中checked就true          每一个都会被判断只要有一个没有选中allChecked就false那我们也不用计算它了
        totalPrice += item.goods_price * item.goods_count;
        totalNum += item.goods_count;
      } else {
        allChecked = false
      }
    })
    allChecked = data.length ? allChecked : false;  // 排除数组为空情况
    this.setData({ allChecked, totalPrice, totalNum })
    // 同步本地缓存
    wx.setStorageSync('cart', data);
  },
  // 结算
  handlePay() {
    // 判断地址
    const { address, totalNum } = this.data
    if (!address.userName) {
      wx.showToast({ title: '没有收货地址', icon: 'none', duration: 1000 })
      return;
    }
    // 判断是否选中商品
    if (totalNum == 0) {
      wx.showToast({ title: '没有选择商品', icon: 'none', duration: 1000 })
      return;
    }
    // 跳转支付页
    wx.navigateTo({ url: '/pages/pay/index' })
  }
})